自定义类型和功能

恭喜您完成了一半的课程。到目前为止你做得很好。在本课中,我们将探讨这些能力——这些能力实际上有助于赋予任何类型执行不同功能的能力。让我们详细探讨一下它们。

能力到底是什么?

在 Move 编程语言中,能力就像特殊规则,决定您可以如何处理某些类型的信息或值。将其视为设置您可以执行的操作的权限,例如共享文档或对其进行编辑。

该系统非常详细,允许您非常具体地了解这些值的行为方式。例如,它可以管理某个值是否可以复制或永久保存在某个地方。

为了实现这一点,Move 使用了一种检查点系统。该语言中的一些基本命令(我们称之为“字节码指令”)需要一个值在使用之前具有正确的“许可单”(或能力)。然而,并不是所有的命令都是严格的。有些不需要这种特殊许可。

因此,简单来说,Move 中的功能有助于严格检查每条数据的功能和去向,确保一切都以正确的方式使用。

能力的语法

要将功能添加到类型,请将功能添加到 struct 并需要使用以下语法。

#![allow(unused)]
fn main() {
 struct StructName has ABILITY [, AnyOtherAbility] { [FIELDS] }
}

示例代码如下所示。

#![allow(unused)]
fn main() {
struct Color has key, store {
	id: UID,
	red: u8
}
}

不同类型的能力

能力有四种类型。

  1. copy :允许复制值。
  2. drop :允许丢弃或自动析构。
  3. store :此功能允许值存在于全局存储的结构内部。
  4. key :此功能允许类型充当全局存储的密钥。

我们来一一讨论。

key能力

key 能力允许类型充当全局存储操作的键。这意味着要对全局存储执行某些操作,我们必须向该类型添加 key 功能。如果结构具有 key 能力,则意味着其所有字段都具有 store 能力。以下是我们如何在 Move on Sui 的代码中使用它。

module examples:: copy {
	// Importing object module
	use sui::object::UID;
	use sui::tx_context::{Self, TxContext};

	// Declaring ExampleObject
	public struct ExampleObject has key {
		id: UID,
	}

	// Initializing the constructor
	public entry fun new(ctx: &mut TxContext): ExampleObject  {
		// Initializing the ExampleObject using let keyword
		let object = ExampleObject {
			id: object::new(ctx),
		}
	}

}

Store能力

store 能力是《Move on Sui》中的一个重要能力。在 Move on Sui 中,在 key 旁边添加 store 是一个很好的做法。存储能力允许结构及其字段存在于全局存储中。这是唯一不需要执行操作的功能,但与 key 功能一起使用时,它会自动控制全局存储中类型的存在。以下是我们如何在 Move on Sui 的代码中使用它。

module examples:: copy {
	// Importing object module
	use sui::object::UID;
	use sui::tx_context::{Self, TxContext};

	// Declaring ExampleObject
	public struct ExampleObject has key, store {
		id: UID,
	}

	// Initializing the constructor
	public entry fun new(ctx: &mut TxContext): ExampleObject  {
		// Initializing the ExampleObject using let keyword
		let object = ExampleObject {
			id: object::new(ctx),
		}
	}

}

在《随水而行》中, key 能力是强制使用的,但 store 能力是可选使用的。

Copy能力

复制能力赋予对象被复制的能力。这意味着它使对象能够使用 copy 运算符进行自身复制。让我们看看如何在代码中使用它。

module examples:: copy {
	// Importing object module
	use sui::object::UID;
	use sui::tx_context::{Self, TxContext};

	// Declaring ExampleObject
	public struct ExampleObject has key, copy {
		id: UID,
	}

	// Initializing the constructor
	public entry fun new(ctx: &mut TxContext): ExampleObject  {
		// Initializing the ExampleObject using let keyword
		let object = ExampleObject {
			id: object::new(ctx),
		}
		// Copying the `object` using `copy` operator 
		let copy_object = copy object;
		copy_object;
	}

}

Drop能力

drop 能力允许我们删除类型。这意味着当 Move 程序执行时,类型会被破坏。具有删除能力的结构意味着该结构的所有实例都将被删除。但是 Move on Sui,对象有一个 UID,我们不能简单地使用 drop 运算符删除 UID。

小结

了解这些能力至关重要,因为它们在《Move on Sui》中被广泛使用。您一定也注意到在前面的示例中,我们经常使用密钥和存储功能。现在您明白我们为什么使用它们了。接下来,我们将详细了解对象,我们将看到更多能力的用例。

quiz

解释 Move 中存储功能的重要性,强调其在允许结构及其字段存在于全局存储中的作用